home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fritz: All Fritz
/
All Fritz.zip
/
All Fritz
/
FILES
/
PROGIALS
/
TEACHCC.LZH
/
LESSON4
< prev
next >
Wrap
Text File
|
1986-02-07
|
15KB
|
406 lines
.NT
A NOTE ABOUT THE LESSONS in C
.b4-24
.R5C4
These were written while the author was ~Ilearning~N the language and since
.R6C4
they are ~Ifree~N ( to copy and/or distribute ) there is a money-back
.R7C4
guarantee on the accuracy of each and every statement in the lessons (!)
.R9C4
The ~Idisplay~N program was written ( in C ) in order to provide a vehicle
.R10C4
for displaying the lessons.
.R12C5
.B
P.J.Ponzo
.B
Dept. of Applied Math
.B
Univ. of Waterloo
.B
Ontario N2L 3G1
.K16,30
PonzoTUTOR
.WNT
FOR WHILE and other good stuff
.R4C1
~b~Imain() ~F{~N
~b~Iint i~N
~b~Ii=1;~N
~b~Iwhile (i<11); {~N
~b~Iprintf("\n The square of %d is %d",i,i*i);~N
~b~Ii=i+1;~N
~b~I}~N
~b~I}~N
.R12C1
This is the opening ~b~I{~N for ~b~Imain()~N.
.WR11C1
~b~I~F}~N
.R4C1
~b~Imain() {~N
.R12C1
This is the closing ~b~I}~N for ~b~Imain()~N.
.WR11C1
~b~I}~N
.R5C1
~Vint i~N
~Vi=1;~N
.R12C1
Here we declare ~b~Ii~N to be an ~b~Iint~Neger variable, and define it
to be (initially) the integer ~b~I1~N.
~IFind the error here!~N
.WR5C1
~Vint i~N should be ~b~Iint i~F;~N
.R17C1
WE FORGOT THE SEMI-COLON!
.WR5C1
~Vint i;~N with SEMI-COLON!
.R12C1
Now that we're debugging our program, let's change these lines so that
the declaration and the initialization of ~b~Ii~N are together:
.WR4C1
~b~Imain() {~N
~b~Iint i=1;~N
~b~Iwhile (i<11); {~N
~b~Iprintf("\n The square of %d is %d",i,i*i);~N
~b~Ii=i+1;~N
~b~I}~N
~b~I}~N
.K4,60
int i=1
;
.WNR2C1
~b~Imain() {~N
~b~Iint i=1;~N
~Vwhile (i<11); {~N
~b~Iprintf("\n The square of %d is %d",i,i*i);~N
~b~Ii=i+1;~N
~b~I}~N
~b~I}~N
.R10C1
Here's something new...it says to execute certain statements again
and again ~Ias long as i is less than 11~N ( or ~b~Iwhile~N i<11 ).
Execute what statements?
.WR4C1
~b~Iwhile (i<11); ~F{~N
.R7C1
~b~I~F}~N
.R15C1
All the stuff between these curly brackets!
...and this stuff says to ~b~Iprintf~N:
~r~I The square of ~N ~r~Iis~N
value of ~b~Ii~N value of ~b~Ii*i~N (the square of ~b~Ii~N)
goes in here. goes in here.
.WR23C1
THIS PROGRAM IS HARD TO READ!
.K19,60
change it!
.WNT
PRETTY PROGRAMS
.R4C1
~b~Imain() /* sexy program */~N
~b~I{ /* start main() */~N
~b~I int i=1; /* declare i=1 */~N
~b~I while (i<11); { /* while i<11 */~N
~b~I printf("\n The square of %d is %d",i,i*i); /* print i, i*i */~N
~b~I i=i+1; /* increment i */~N
~b~I } /* end of while */~N
~b~I} /* end of main */~N
Here's the same program again...but nicer to read!
Anything between ~b~I/*~N and ~b~I*/~N is a ~Icomment~N and is ignored
by the C-compiler (it's for human consumption only) so we've added a
comment to every line. NOW we can see what the program does by reading
~Ionly~N the comments!
Indenting the various parts makes for easier reading (again for human
consumption ...the compiler doesn't care).
.WR5C1
~F~b~I{~N
.R11C1
~F~b~I}~N
.w
.R13C1
.R13C1
The start and end of ~b~Imain()~N are easy to spot.
(Although different programmers use different formats, ~IWE~N will
always start and end ~b~Imain()~N with ~b~I{~N and ~b~I}~N in the ~Ifirst~N
column) Well ...sometimes we will start with: ~b~Imain() {~N
.WR5C1
~b~I{~N
.R11C1
~b~I}~N
.R7C1
~b~I while (i<11); ~F{~N~b~I~W /* while i<11 */~N
.R10C1
~b~I ~F}~N~b~I~W /* end of while */~N
.R18C1
...and we start a ~b~Iwhile~N loop with ~b~Iwhile (....) ~F{~N and end it
with ~b~I~F}~N placed directly below the ~b~Iw~N in ~b~Iw~Nhile.
...and we will always (?) ~Iindent~N (by 4 spaces) these ~Iinside loops~N.
.W
.K5,35
ALWAYS!?
.WNR1C1
~b~Imain() /* sexy program */~N
~b~I{ /* start main() */~N
~b~I int i=1; /* declare i=1 */~N
~b~I while (i<11); { /* while i<11 */~N
~b~I printf("\n The square of %d is %d",i,i*i); /* print i, i*i */~N
~b~I i=i+1; /* increment i */~N
~b~I } /* end of while */~N
~b~I} /* end of main */~N
Alas, this program won't even compile!
Whereas most C statements end in a SEMI-COLON, the ~b~Iwhile (...)~N does
~INOT~N. We must delete the ~b~I;~N after a ~b~Iwhile~N.
.R4C1
~b~I while (i<11)~F;~N~b~I~W { /* while i<11 */~N
.WR4C1
~b~I while (i<11) { /* while i<11 */~N
.WNR1C1
~b~Imain() /* sexy program */~N
~b~I{ /* start main() */~N
~b~I int i=1; /* declare i=1 */~N
~b~I while (i<11) { /* while i<11 */~N
~b~I printf("\n The square of %d is %d",i,i*i); /* print i, i*i */~N
~b~I i=i+1; /* increment i */~N
~b~I } /* end of while */~N
~b~I} /* end of main */~N
The construction: ~V i=1; ~N
~V while (i<11) { ~N
~V some statements; ~N
~V i=i+1; ~N
~V } ~N
occurs so often (in any language) that a slick mechanism exists ~Ifor~N
handling this loop:
~V for (i=1; i<11; i=i+1) { ~N
~V some statements; ~N
~V } ~N
.WNR1C1
~b~Imain() /* sexy program */~N
~b~I{ /* start main() */~N
~b~I int i; /* declare i */~N
~b~I for (i=1; i<11; i=i+1) { /* the for loop */~N
~b~I printf("\n The square of %d is %d",i,i*i); /* print i, i*i */~N
~b~I } /* end of for */~N
~b~I} /* end of main */~N
Note that the ~Ifor loop~N automatically initializes ~b~Ii~N to ~b~I1~N,
then does the ~b~Iprintf()~N again and again, each time incrementing ~b~Ii~N,
until ~b~Ii~N has the value ~I11~N ( ..then the program exits from this loop
after ~b~Iprintf~N-ing for the last time with ~b~Ii~N=10).
The value of ~b~Ii~N, after the exit from the loop, is ~I11~N.
.K19,60
NOT
10
.WN
..and, just to check it all out, we leave our word processor after saving
this ~Isource~N code under the name ~Iprogram2.c~N, then type:
~Icc program2~N
then (assuming it compiles without errors!) we finish with:
~Ilink program2~N
then ( since this ~Icompile/link~N procedure will generate an ~Iexe~Ncutable
file called ~Iprogram2.exe~N ) we type:
~Iprogram2~N
and the ~Iexe~Ncutable program will load from disk, then execute, to give:
.K17,30
GO!GO!GO!
.WN
~r~I The square of 1 is 1~N
~r~I The square of 2 is 4~N
~r~I The square of 3 is 9~N
~r~I The square of 4 is 16~N
~r~I The square of 5 is 25~N
~r~I The square of 6 is 36~N
~r~I The square of 7 is 49~N
~r~I The square of 8 is 64~N
~r~I The square of 9 is 81~N
~r~I The square of 10 is 100~N
.K17,30
!
.K17,30
l!
.K17,30
ul!
.K17,30
ful!
.K17,30
rful!
.K17,30
erful!
.K17,30
derful!
.K17,30
nderful!
.K17,30
onderful!
.K17,30
wonderful!
.K17,30
wonderful!
.WN
1 ~b~I i=5; ~N
2 ~b~I while (i<5) { ~N
3 ~b~I some statements; ~N
4 ~b~I } ~N
In this piece of code, the ~b~Iwhile~N loop will be executed only as long as
~b~Ii<5~N. Since we set ~b~Ii=5~N in Line 1, the loop would be bypassed.
~IThe condition, in a while loop, is checked at the beginning of the loop!~N
Usually this is what we want .... but, sometimes it is NOT:
.W
~b~I while (sam>100) { ~N
~b~I -------------------------------------------- ~N
~b~I some statements which calculate some numbers ~N
~b~I and use these to compute the value of sam. ~N
~b~I -------------------------------------------- ~N
~b~I } ~N
In this piece of code the value of ~b~Isam~N is not even known until we go
through the ~b~Iwhile~N loop ...so we want to check the ~Iwhile-condition~N
at the END of the loop !!!
.WNT
now DO this for a WHILE
.R4C1
~b~I while (sam>100) { ~N
~b~I -------------------------------------------- ~N
~b~I some statements which calculate some numbers ~N
~b~I and use these to compute the value of sam. ~N
~b~I -------------------------------------------- ~N
~b~I } ~N
We replace the above construction by a ~IDO-WHILE~N:
~b~I do { ~N
~b~I -------------------------------------------- ~N
~b~I some statements which calculate some numbers ~N
~b~I and use these to compute the value of sam. ~N
~b~I -------------------------------------------- ~N
~b~I } while (sam>100)~F;~N~b~I ~N
...and (magic) the ~Iwhile-condition~N is checked at the
~Iend of the loop~N!
.K19,60
while
;
.WN
1 ~b~I double x=1.0, y, e; /* double precision ! */ ~N
2 ~b~I do { /* start of the do-loop*/ ~N
3 ~b~I y=2.0*sin(x); /* calculate y */ ~N
4 ~b~I e=fabs(y-x); /* calculate error */ ~N
5 ~b~I x=y; /* change x to y */ ~N
6 ~b~I } while (e>.0000005); /* end condition */ ~N
7 ~b~I printf("x-2sin(x)=%f when x=%f",e,x); ~N
This program calulates the root of the equation: ~Ix-2*sin(x)=0~N
by starting with ~b~Ix=1.0~N (Line 1), then repeatedly replacing ~b~Ix~N
by y in Line 5 ( where y is calculated as 2.0*sin(x) in Line 3 ).
While the error,( the ~b~If~Nloating point ~b~Iabs~Nolute value of ~b~Iy-x~N,
calculated in Line 4) exceeds ~b~I.0000005~N we repeat the loop.
Finally, when the ~Iwhile-condition~N (in Line 6) is false (i.e. when
~b~Ie~N is LESS THAN OR EQUAL to .0000005), we print:
~r~Ix-2sin(x)=0.000000 when x=1.895494~N correct to 6 decimal places!
.W
..and it's nice to check the error ~b~Ie~N after we go thru' the loop!
.WNT
a REVIEW
.R5C1
~b~Iwhile (something is true ) {~N
~b~I do these statements; ~N
~b~I} ~N
~b~Ifor (initialize variables;repeat,if this is true;do this at end of loop) {~N
~b~I do these statements; ~N
~b~I} ~N
~INOTE~N: If there is only ~Ione~N statement to perform, in either a ~b~Iwhile~N
or a ~b~Ifor~N loop, then we don't need the ~b~I{~N and ~b~I}~N:
~b~I ~N
~b~Ifor (i=0; i<11; i=i+1) ~N NO OPENING {
~b~I printf("\n The square of %d is %d",i,i*i); ~N or CLOSING }
~b~I ~N
.WN
~b~Ido { ~N
~b~I do these statements; ~N
~b~I} while (something is true)~F;~N~b~I ~N
.R10C1
~INOTE~N: The ~Iwhile~N which occurs at the end of a ~IDO loop~N needs
a ~ISEMI-COLON~N !!!
.b9-12
.K17,32
but..but..
.WN
We can also invoke a function ( like ~b~Igetchar()~N ) ~Iwhile~N inside....
~b~Ichar key; ~N
~b~Iwhile ( (key = getchar()) != 'e' ) ~N
~b~I printf(" You pressed %c \n",key); ~N
~b~Iprintf("\n THAT'S THE eND"); ~N
..where we wait for a ~Isingle~N keypress (that's what ~b~Igetchar()~N does!),
and assign the key to the ~b~Ichar~N variable ~b~Ikey~N via ~b~Ikey=getchar()~N,
and so long as ~b~Ikey~N is ~Inot equal~N to the letter ~I'e'~N, we ~b~Iprintf()~N
the ~b~Ikey~N (as a ~b~I%c~Nharacter) and then a ~b~I\n~Newline .
~INOTE~N: ~b~Iscanf("%c",&key)~N would require your pressing the ~Ienter~N key
after each of the letters ~Ia~N, ~Ib~N, etc. ... so we used ~b~Igetchar()~N!
This program would give (if you pressed ~Ia~N then ~Ib~N then ~Ic~N etc.):
~Ia ~r You pressed a~N
~Ib ~r You pressed b~N
~Ic ~r You pressed c~N
~Id ~r You pressed d~N
~Ie~N
~r~I THAT'S THE eND~N
.WN
.T
THAT'S THE eND FOLKS!
.K16,30
au revoir!
.q